package study;

/**
 * 抽象模板
 */
abstract class AbstractTemplte {
    /**
     * 必须要实现的一个业务方法
     */
    public abstract void abstractMethod();

    /**
     * 定义一个可以重写也可以不重写的方法
     */
    public void hookMethod() {
        System.out.println("程序开始执行");
    }

    /**
     * 必须不能被重写的方法
     */
    public final long concrateMethod() {
        long currentTime = System.currentTimeMillis();
        return currentTime;
    }

    /**
     * 模板方法,供其它类来使用
     */
    public long templateMethod() {
        hookMethod();

        //获得执行前的时间
        long startTime = concrateMethod();
        abstractMethod();
        //获得执行后的时间
        long endTime = concrateMethod();
        return endTime - startTime;

    }
}

/**
 * 具体的模板
 */
class ContrateTemplate extends AbstractTemplte {

    /**
     * 实现具体的业务逻辑
     */
    @Override
    public void abstractMethod() {
        for (int i = 0; i < 100; i++) {
            System.out.println("程序正在执行" + i + "%");
        }
    }
}


public class TemplaterDemo {
    public static void main(String[] args) {
        ContrateTemplate ct = new ContrateTemplate();
        long doTime = ct.templateMethod();
        System.out.println("程序的运行时间是："+ doTime+"毫秒");
    }
}
